package Week01

import (
	"crypto/rand"
	"fmt"
	"math/big"
	"strconv"
)

func Run() {
	/*项目要求:
	程序随机产生一个 1–100 之间的秘密整数 n，让用户来猜。
	提示用户，输入一个想猜的数 x。
	如果 x = n，则猜数成功，打印祝贺信息并退出程序。
	否则，根据 x 和 n 的大小关系输出提示信息，继续让用户来猜。
	ps：二分法
	*/
	//获取随机数
	maxnum := 1300
	minnum := 0
	res := Rand(minnum, maxnum)

	var x string
	fmt.Println(minnum, "-", maxnum, "的随机数")
	for true {
		fmt.Scanln(&x)
		if x == "自动" {
			fmt.Println("开始自动猜数")
			zdnum := Auto(minnum, maxnum, res)
			fmt.Println("最终结果为:", zdnum)
		} else if x == "exit" {
			fmt.Println("认怂了么？\nBye Bye")
			break
		} else {
			xnum, xerr := strconv.Atoi(x)
			if xerr != nil {
				fmt.Println("请输入有效值\n")
			} else {
				testnum := Test(xnum, res)
				if testnum == 0 {
					fmt.Println("恭喜猜对了！！ 正确答案是:", res)
					break
				} else if testnum == 1 {
					fmt.Println("大了")
				} else {
					fmt.Println("小了")
				}
			}
		}
	}
	//fmt.Println("x=", x)
}

//自动猜测
func Auto(minnum int, maxnum int, ret int) int {
	var res int

	res = (minnum + maxnum) / 2
	fmt.Println(res)
	if Test(res, ret) == 1 {
		res = Auto(minnum, res, ret)
	} else if Test(res, ret) == 2 {
		res = Auto(res, maxnum, ret)
	}

	return res
}

//生成随机数
func Rand(minnum int, maxnum int) int {
	var n int
	//binary.Read(rand.Reader, binary.LittleEndian, &n)
	for true {
		num, err := rand.Int(rand.Reader, big.NewInt(int64(maxnum)))
		if err == nil {
			strInt64 := strconv.FormatInt(num.Int64(), 10)
			id16, _ := strconv.Atoi(strInt64)
			n = id16
			if n < minnum {
				n += minnum
			}
			break
		}
	}
	return n
}

//验证
func Test(numin int, ret int) int {
	var res int
	if numin == ret {
		res = 0
	} else if numin > ret {
		res = 1
	} else {
		res = 2
	}
	return res
}
